讀書進度順利過半,已經到第五章節 —— Implementations!下午幫朋友慶生大快朵頤,現在整個人昏昏欲睡。難得的快樂假日,就稍微休息一下,簡單做個閱讀筆記吧。
在 C++ 中,定義變數時會產生構造開銷和析構開銷。即使變數沒有被使用,這些開銷在拋出異常時依然可能浪費資源。為了優化效能應盡量推遲變數定義,直到真的需要它的時候,並避免定義未使用的變數。在構造時直接賦值可提高效率,亦能增加程式的可讀性。
對於迴圈的變數宣告,則分為兩種情況,其分別的成本如下。
型別轉換可能破壞 C++ 的類型安全性,增加程式碼的風險和複雜性。尤其是 dynamic_cast
在執行時會消耗額外的性能。若有需要進行型別轉換,最好將其封裝在函式內,以減少對外部程式碼的影響。避免使用 C 風格的類型轉換。
C++ 有另外三種常見的型別轉換,其各自有潛在的安全風險。
static_cast
:用於大多數明確的型別轉換。若發生在編譯階段,不會做執行階段檢查。
void*
轉為具類型指標。const
。const_cast
:唯一可移除 const
或 volatile
限定符的轉換方式,常用於將 const
傳給 non-const 的函式。reinterpret_cast
:用於非常底層且具有危險的指標轉換,如 int*
轉為 char*
等。幾乎無檢查機制,且轉換結果不一定有意義。返回指向內部成員的 handle 會破壞封裝性,這等同於讓外部程式碼直接操作物件的內部狀態。即使成員函數聲明為 const
,返回的 handle 仍可能允許修改內部變數,造成數值不一致且難以追蹤。舉例來說,若 handle 為指標:
class YoyoScore {
private:
int value;
public:
int* getValue() { return &value; }
};
此外,應避免返回指向暫時物件的 handle,避免因生命週期較短導致的 dangling handle 問題。